package com.tueye.utils;

import org.apache.commons.lang.StringUtils;

/**
 * 按字节长度截取字符串
 * 
 * @author hanxiaowei
 * 
 */
public class ByteSubString {
	
	/**
	 * 只去校验VARCHAR2,CHAR,NUMBER类型的值
	 * @param str
	 * @param length
	 * @param type
	 * @return
	 */
	public static boolean isSubString(String str,int length,String type){
		if(StringUtils.isEmpty(str))return false;
		if(type.toUpperCase().startsWith("VARCHAR2")||type.toUpperCase().startsWith("CHAR")||
			type.toUpperCase().startsWith("NUMBER")||type.toUpperCase().startsWith("NVARCHAR2")){
			
			if(str.getBytes().length>length)return true;
		}
		return false;
	}
	
	public static String bSubString(String str, int length)
			{
		try {
			byte[] bytes = str.getBytes("Unicode");
			int n = 0; // 表示当前的字节数
			int i = 2; // 要截取的字节数，从第3个字节开始
			for (; i < bytes.length && n < length; i++) {
				// 奇数位置，如3、5、7等，为UCS2编码中两个字节的第二个字节
				if (i % 2 == 1) {
					n++; // 在UCS2第二个字节时n加1
				} else {
					// 当UCS2编码的第一个字节不等于0时，该UCS2字符为汉字，一个汉字算两个字节
					if (bytes[i] != 0) {
						n++;
					}
				}
			}
			// 如果i为奇数时，处理成偶数
			if (i % 2 == 1){
				// 该UCS2字符是汉字时，去掉这个截一半的汉字
				if (bytes[i - 1] != 0)
					i = i - 1;
				// 该UCS2字符是字母或数字，则保留该字符
				else
					i = i + 1;
			}

			return new String(bytes, 0, i, "Unicode");
		} catch (Exception e) {
			throw new RuntimeException("截取字符串出错.",e);
		}
	}
	
	public static void main(String[] ss){
		
		String s = "韩氏企业集团有限股份公司,888888886666666--66^==-4";
		
			try {
				System.out.println(bSubString(s, 7));
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		
	}
}